<template>
  <div id="cpn-scroll-field">
    <!--mescroll滚动区域的基本结构-->
    <mescroll-vue ref="mescroll" :down="mescrollDown" :up="mescrollUp" @init="mescrollInit">
      <div v-for="(item, index) in dataList" :key="index">
        <slot name="scope" :item="item" :index="index">
          <!-- {{ item }} -->
        </slot>
      </div>
      <!--内容...-->
    </mescroll-vue>
  </div>
</template>

<script>
import MescrollVue from 'mescroll.js/mescroll.vue'
import service from '@/api/request'
export default {
  name: 'scroll-field',
  components: {
    MescrollVue // 注册mescroll组件
  },
  data() {
    return {
      mescroll: null, // mescroll实例对象
      mescrollDown: {}, // 下拉刷新的配置. (如果下拉刷新和上拉加载处理的逻辑是一样的,则mescrollDown可不用写了)
      mescrollUp: { // 上拉加载的配置.
        callback: this.upCallback, // 上拉回调,此处简写; 相当于 callback: function(page, mescroll) { }
        // 以下是一些常用的配置,当然不写也可以的.
        page: {
          num: 0, // 当前页 默认0,回调之前会加1; 即callback(page)会从1开始
          size: 10 // 每页数据条数,默认10
        },
        htmlNodata: "<p class='upwarp-nodata'>-- END --</p>",
        noMoreSize: 5, // 如果列表已无数据,可设置列表的总数量要大于5才显示无更多数据;避免列表数据过少(比如只有一条数据), 显示无更多数据会不好看这就是为什么无更多数据有时候不显示的原因
        toTop: {
          // 回到顶部按钮
          src: './static/mescroll/mescroll-totop.png', // 图片路径,默认null,支持网络图
          offset: 1000 // 列表滚动1000px才显示回到顶部按钮
        },
        empty: {
          // 列表第一页无任何数据时,显示的空提示布局; 需配置warpId才显示
          warpId: 'xxid', // 父布局的id (1.3.5版本支持传入dom元素)
          icon: './static/mescroll/mescroll-empty.png', // 图标,默认null,支持网络图
          tip: '暂无相关数据~' // 提示
        }
      },
      dataList: [] // 列表数据
    }
  },
  beforeRouteEnter(to, from, next) { // 如果没有配置顶部按钮或isBounce,则beforeRouteEnter不用写
    next(vm => {
      // 滚动到原来的列表位置,恢复顶部按钮和isBounce的配置
      vm.$refs.mescroll && vm.$refs.mescroll.beforeRouteEnter()
    })
  },
  beforeRouteLeave(to, from, next) { // 如果没有配置顶部按钮或isBounce,则beforeRouteLeave不用写
    // 记录列表滚动的位置,隐藏顶部按钮和isBounce的配置
    this.$refs.mescroll && this.$refs.mescroll.beforeRouteLeave()
    next()
  },
  mounted() {
  },
  methods: {
    // mescroll组件初始化的回调,可获取到mescroll对象
    mescrollInit(mescroll) {
      this.mescroll = mescroll // 如果this.mescroll对象没有使用到,则mescrollInit可以不用配置
    },
    // 上拉回调 page = {num:1, size:10}; num:当前页 ,默认从1开始; size:每页数据条数,默认10
    upCallback(page, mescroll) {
      // 联网请求
      service({
        url: '/article/list',
        method: 'post',
        data: {
          page: page.num,
          pageSize: page.size
        }
      }).then((response) => {
        // 请求的列表数据
        let arr = response.list
        // 如果是第一页需手动置空列表
        if (page.num === 1) this.dataList = []
        // 把请求到的数据添加到列表
        this.dataList = this.dataList.concat(arr)
        // 数据渲染成功后,隐藏下拉刷新的状态
        this.$nextTick(() => {
          mescroll.endSuccess(arr.length)
        })
      }).catch((e) => {
        // 联网失败的回调,隐藏下拉刷新和上拉加载的状态;
        mescroll.endErr()
      })
    },
    /**
     * 重置列表为第一页 (常用于列表筛选条件变化或切换菜单时重新刷新列表数据)
        内部实现: 把page.num=1,再主动触发up.callback
        isShowLoading 是否显示进度布局;
        1.默认null,不传参,则显示上拉加载的进度布局
        2.传参true, 则显示下拉刷新的进度布局
        3.传参false,则不显示上拉和下拉的进度 (常用于静默更新列表数据)
     */
    resetUpScroll() {
      this.mescroll.resetUpScroll()
    }
  }
}
</script>

<style lang="scss" scoped>
#cpn-scroll-field {
  height: 100%;

  /*通过fixed固定mescroll的高度*/
  .mescroll {
    // position: fixed;
    // top: 44px;
    // bottom: 0;
    // height: auto;

    position: relative;
    top: 0;
    height: 100%;
  }

}
</style>